/**
 * 日期时间工具类
 */

/**
 * 获取当前日期，格式为 YYYY-MM-DD
 * @returns {string} 当前日期字符串
 */
export const getToday = (): string => {
  const d = new Date();
  const month = (d.getMonth() + 1).toString().padStart(2, '0');
  const day = d.getDate().toString().padStart(2, '0');
  return `${d.getFullYear()}-${month}-${day}`;
};

/**
 * 获取当前日期时间，格式为 YYYY-MM-DD HH:mm:ss
 * @returns {string} 当前日期时间字符串
 */
export const getNow = (): string => {
  const d = new Date();
  const month = (d.getMonth() + 1).toString().padStart(2, '0');
  const day = d.getDate().toString().padStart(2, '0');
  const hours = d.getHours().toString().padStart(2, '0');
  const minutes = d.getMinutes().toString().padStart(2, '0');
  const seconds = d.getSeconds().toString().padStart(2, '0');
  return `${d.getFullYear()}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};

/**
 * 格式化日期
 * @param {Date | string | number} date 日期对象、日期字符串或时间戳
 * @param {string} format 格式化模板，默认为 'YYYY-MM-DD'
 * @returns {string} 格式化后的日期字符串
 */
export const formatDate = (date: Date | string | number, format: string = 'YYYY-MM-DD'): string => {
  const d = new Date(date);

  if (isNaN(d.getTime())) {
    return '';
  }

  const year = d.getFullYear();
  const month = (d.getMonth() + 1).toString().padStart(2, '0');
  const day = d.getDate().toString().padStart(2, '0');
  const hours = d.getHours().toString().padStart(2, '0');
  const minutes = d.getMinutes().toString().padStart(2, '0');
  const seconds = d.getSeconds().toString().padStart(2, '0');

  return format
    .replace('YYYY', year.toString())
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds);
};

/**
 * 获取指定日期的开始时间（00:00:00）
 * @param {Date | string | number} date 日期
 * @returns {Date} 指定日期的开始时间
 */
export const getStartOfDay = (date: Date | string | number = new Date()): Date => {
  const d = new Date(date);
  d.setHours(0, 0, 0, 0);
  return d;
};

/**
 * 获取指定日期的结束时间（23:59:59）
 * @param {Date | string | number} date 日期
 * @returns {Date} 指定日期的结束时间
 */
export const getEndOfDay = (date: Date | string | number = new Date()): Date => {
  const d = new Date(date);
  d.setHours(23, 59, 59, 999);
  return d;
};

/**
 * 计算两个日期之间的天数差
 * @param {Date | string | number} startDate 开始日期
 * @param {Date | string | number} endDate 结束日期
 * @returns {number} 天数差
 */
export const getDaysDiff = (startDate: Date | string | number, endDate: Date | string | number): number => {
  const start = new Date(startDate);
  const end = new Date(endDate);
  const diffTime = Math.abs(end.getTime() - start.getTime());
  return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
};

/**
 * 添加天数到指定日期
 * @param {Date | string | number} date 基准日期
 * @param {number} days 要添加的天数
 * @returns {Date} 新的日期对象
 */
export const addDays = (date: Date | string | number, days: number): Date => {
  const d = new Date(date);
  d.setDate(d.getDate() + days);
  return d;
};

/**
 * 检查是否为有效日期
 * @param {any} date 要检查的值
 * @returns {boolean} 是否为有效日期
 */
export const isValidDate = (date: any): boolean => {
  return date instanceof Date && !isNaN(date.getTime());
};

/**
 * 判断计划完成时间是否逾期
 * @param {string | Date | number} planEndTime 计划完成时间
 * @param {string | Date | number} currentTime 当前时间，默认为当前时间
 * @returns {boolean} 是否逾期，true表示逾期，false表示未逾期
 */
export const isOverdue = (planEndTime: string | Date | number, currentTime: string | Date | number = new Date()): boolean => {
  // 如果计划完成时间为空，则不算逾期
  if (!planEndTime) {
    return false;
  }

  try {
    const planEnd = new Date(planEndTime);
    const current = new Date(currentTime);

    // 检查日期是否有效
    if (isNaN(planEnd.getTime()) || isNaN(current.getTime())) {
      return false;
    }

    // 比较日期，如果计划完成时间早于当前时间，则逾期
    return planEnd < current;
  } catch (error) {
    console.error('日期比较出错:', error);
    return false;
  }
};

/**
 * 获取逾期状态文本
 * @param {boolean} isOverdue 是否逾期
 * @returns {string} 逾期状态文本
 */
export const getOverdueStatusText = (isOverdue: boolean): string => {
  return isOverdue ? '已逾期' : '未逾期';
};

/**
 * 获取逾期状态类型（用于Element Plus的Tag组件）
 * @param {boolean} isOverdue 是否逾期
 * @returns {string} 状态类型
 */
export const getOverdueStatusType = (isOverdue: boolean): 'danger' | 'success' => {
  return isOverdue ? 'danger' : 'success';
};
